/**
 * 
 */
package edu.tfh.s2.ehkbot.unitTest;

import static org.junit.Assert.*;

import org.junit.Test;

import edu.tfh.s2.ehkbot.steuerung.Position;

/**
 * Testet die Positions Klasse.
 * 
 * @author s2zehn
 */
public class PositionTest {

	public boolean testeWinkel(Position pos1, Position pos2, double sollWinkel) {
		double epsilon = 1e-15;
		double winkelDiffernenz = pos1.richtung(pos2).getAlsRad() - sollWinkel;
		return Math.abs(winkelDiffernenz) < epsilon;
	}

	/**
	 * Testet ob getKoordinate 3 Werte für xyz zurück gibt.
	 */
	@Test
	public void testKordinatenLength() {
		Position p = new Position();
		int[] kord = p.getKoordinate();
		assertTrue(kord.length == 3);

	}

	/**
	 * Testet auf die maximal mögliche Koordinate.
	 */
	@Test
	public void testPostionMax() {
		Position p = new Position();
		p.setX(Integer.MAX_VALUE);
		p.setY(Integer.MAX_VALUE);
		p.setZ(Integer.MAX_VALUE);

		assertEquals("Sind nicht gleich", p.getX(), Integer.MAX_VALUE);
		assertEquals("Sind nicht gleich", p.getY(), Integer.MAX_VALUE);
		assertEquals("Sind nicht gleich", p.getZ(), Integer.MAX_VALUE);
	}

	/**
	 * Testet auf die minimal mögliche Koordinate.
	 */
	@Test
	public void testPostionMin() {
		Position p = new Position();
		p.setX(Integer.MIN_VALUE);
		p.setY(Integer.MIN_VALUE);
		p.setZ(Integer.MIN_VALUE);
		assertEquals("Sind nicht gleich", p.getX(), Integer.MIN_VALUE);
		assertEquals("Sind nicht gleich", p.getY(), Integer.MIN_VALUE);
		assertEquals("Sind nicht gleich", p.getZ(), Integer.MIN_VALUE);
	}

	/**
	 * Testet ob die Winkel Stimmen.
	 */
	@Test
	public void testWinklel() {
		// X Y Z
		Position mitte = new Position(1, 1, 0);
		Position nord = new Position(1, 0, 0);
		Position sued = new Position(1, 2, 0);
		Position ost = new Position(2, 1, 0);
		Position west = new Position(0, 1, 0);

		double sollNordWinkel = Math.PI / 2;
		double sollSuedWinkel = 3.0 / 2 * Math.PI;
		double sollOstWinkel = 0 * Math.PI;
		double sollWestWinkel = Math.PI;

		assertTrue("Winkel falsch berechnet", testeWinkel(mitte, nord, sollNordWinkel));
		assertTrue("Winkel falsch berechnet", testeWinkel(mitte, sued, sollSuedWinkel));
		assertTrue("Winkel falsch berechnet", testeWinkel(mitte, ost, sollOstWinkel));
		assertTrue("Winkel falsch berechnet", testeWinkel(mitte, west, sollWestWinkel));
	}

	/**
	 * Testet ob der von getKoordinate zurückgegebener Vektor in der richtigen Reinfolge X Y Z ist
	 */
	@Test
	public void testXYZOrder() {
		Position p = new Position();
		p.setX(0);
		p.setY(1);
		p.setZ(2);
		int[] kord = p.getKoordinate();
		for (int i = 0; i < 3; ++i) {
			assertTrue(kord[i] == i);
		}
	}

}
